java我应该如何并行化计算代价高昂的for循环并整理迭代结果?
我在一台8核机器上工作,正在执行一项计算繁重的任务。然而,任务的每次执行(即for循环的迭代)都与前一个任务相当独立。从一次执行到下一次执行,只有一些变量被“汇总”。我猜这是并行化/线程化的一个很好的例子,但我不知道该怎么做
下面是代码的外观。现在,它只是我的主executor类中主方法的一部分:
double testerPayoffSum = 0.0, developerPayoffSum = 0.0;
Random seed = new Random();
try {
for (int i = 0; i < GameConstants.MAX_GAMES; i++) {
EraserSimulator eraser = new EraserSimulator(GameConstants.MAX_TARGETS, GameConstants.MAX_RESOURCES, GameConstants.NUM_ATTACKER_TYPES, seed.nextInt());
Map<Set<SingleObjectiveTarget>, Double> gameStrategy = eraser.run();
assert (gameStrategy != null);
TestingGameSimulator testingGame = new TestingGameSimulator(GameConstants.MAX_TARGETS, gameStrategy, GameConstants.NUM_GAMES_TO_STORE_FOR_HISTORY, GameConstants.NUM_TESTING_GAMES_TO_PLAY);
PlayerPayoffs payoffs = testingGame.run(eraser.getEraserInstance());
testerPayoffSum += payoffs.getAverageTesterPayoff(GameConstants.NUM_TESTING_GAMES_TO_PLAY);
developerPayoffSum += payoffs.getAverageDeveloperPayoff(GameConstants.NUM_TESTING_GAMES_TO_PLAY);
System.out.print("Output: ERASER Games played; Number of developers caught");
System.out.print(", " + GameConstants.NUM_TESTING_GAMES_TO_PLAY + ", " + payoffs.getNumTimesCaught() + "\n");
} catch(Exception e){sendEmailAlert("Execution Failed with Exception");}
如果可能的话,我想并行化for-loop
计算,并继续对testerPayoffSum
和developerPayofffSum
变量求和。我怎样才能做到这一点
注意:for循环的每次执行大约需要20-30分钟,具体取决于输入大小(由各种GameConstant
设置)。即使对少数人来说,上述过程也需要将近2-3个小时
# 1 楼答案
声明队列以收集结果并将任务提交到线程池:
然后收集并汇总结果:
# 2 楼答案
创建一个线程对象来实现
Callable
,它返回一个包含testerPayoffSum
和developerPayoffSum
的Future
对象,开始计算并汇总从Future
获得的结果(另请参见https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6)# 3 楼答案
你确定你没有依赖关系吗
一,。使用过的类不能共享任何变量
二,。使用过的课程不得使用任何类型的机器学习
[注]
[锁]
但是你也可以用你自己的东西
请注意,锁有时会导致应用程序冻结,尤其是在重载使用时